/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package tela.iptsp;

import ferramentas.CFG;
import ferramentas.Query;
import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.UnsupportedEncodingException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import javax.activation.UnsupportedDataTypeException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import tela.iptsp.modelo.InscritoIPTSP;

/**
 *
 * @author Lauro
 */
public class formularioMatriculaIPTSP2 extends HttpServlet {

    private static final String TMP_DIR_PATH = System.getProperty("java.io.tmpdir");
    private File tmpDir = new File(TMP_DIR_PATH);
    private int MAX_SIZE_UPLOAD = 5 * 1024 * 1024; // 5Mb
    private String ENCODING = "UTF-8";
    private String email;
    private String nome;
    private int id;

    /** 
     * Processes requests for both HTTP <code>GET</code> and <code>POST</code> methods.
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        request.setCharacterEncoding("UTF-8");
        response.setCharacterEncoding("UTF-8");
        PrintWriter out = response.getWriter();
        try {
            SimpleDateFormat formatter = new SimpleDateFormat("dd/MM/yyyy hh:mm:ss");
            String finalInscricoesString = "16/02/2013 00:00:00";
            Date finalInscricoes = formatter.parse(finalInscricoesString);
            Date agora = new Date();

            if (agora.after(finalInscricoes)) {
                throw new UnsupportedDataTypeException();
            } else {
                ServletFileUpload handler = getHandler();

                // Check that we have a file upload request
                boolean isMultipart = ServletFileUpload.isMultipartContent(request);

                if (isMultipart) {
                    List items = getItemsRequest(request, handler);

                    out.println("<html>");
                    out.println("<head>");
                    out.println("<title>Processando Matrícula...</title>");
                    out.println("</head>");
                    out.println("<body>");
                    out.println("Aguarde...<br />");

                    String cpf = getParameter("cpf", items);
                    cpf = cpf.replaceAll("\\.", "");
                    cpf = cpf.replaceAll("-", "");

                    Query q = new Query();

                    boolean isCadastrado = false;
                    if (!cpf.isEmpty()) {
                        isCadastrado = q.isUsuarioCadastradoIPTSP2(cpf);
                    }

                    if (isCadastrado) {
                        // == DADOS PESSOAIS
                        //nome = getParameter("nome", items);

                        // == ENDEREÇO
                        String rua = getParameter("rua", items);
                        String complemento = getParameter("complemento", items);
                        String bairro = getParameter("bairro", items);
                        String cidade = getParameter("cidade", items);
                        String estado = getParameter("estado", items);
                        String cep = getParameter("cep", items);
                        cep = cep.replaceAll("-", "");

                        // == CONTATO
                        String telefone_residencial = getParameter("telefone_residencial", items);
                        String telefone_celular = getParameter("telefone_celular", items);
                        email = getParameter("email", items);

                        // == POLO DE APOIO PRESENCIAL
                        //String polo = getParameter("polo", items);

                        // == COMPROVANTES
                        FileItem comprovante_rg = getFile("comprovante_rg", items);
                        FileItem comprovante_cpf = getFile("comprovante_cpf", items);
                        FileItem termo_deslocamento = getFile("termo_deslocamento", items);

                        String caminhoArquivo = "";
                        File arquivoDocumento = null;
                        // Salvar comprovante_graduacao
                        String extensao_arquivo5 = "";
                        if (comprovante_rg.getSize() > 0) {
                            extensao_arquivo5 = getExtensaoArquivo(comprovante_rg.getName());
                            caminhoArquivo = getPastaDocumentos() + CFG.IPTSP2_COMPROVANTE_RG + System.getProperty("file.separator") + cpf + extensao_arquivo5;
                            arquivoDocumento = new File(caminhoArquivo);
                            comprovante_rg.write(arquivoDocumento);
                        }
                        // Salvar comprovante
                        String extensao_arquivo6 = "";
                        if (comprovante_cpf.getSize() > 0) {
                            extensao_arquivo6 = getExtensaoArquivo(comprovante_cpf.getName());
                            caminhoArquivo = getPastaDocumentos() + CFG.IPTSP2_COMPROVANTE_CPF + System.getProperty("file.separator") + cpf + extensao_arquivo6;
                            arquivoDocumento = new File(caminhoArquivo);
                            comprovante_cpf.write(arquivoDocumento);
                        }
                        // Salvar carta_comprimisso
                        String extensao_arquivo7 = "";
                        if (termo_deslocamento.getSize() > 0) {
                            extensao_arquivo7 = getExtensaoArquivo(termo_deslocamento.getName());
                            caminhoArquivo = getPastaDocumentos() + CFG.IPTSP2_TERMO_DESLOCAMENTO + System.getProperty("file.separator") + cpf + extensao_arquivo7;
                            arquivoDocumento = new File(caminhoArquivo);
                            termo_deslocamento.write(arquivoDocumento);
                        }

                        InscritoIPTSP inscrito = new InscritoIPTSP(cpf, rua, complemento, bairro, cidade, estado, cep, telefone_residencial, telefone_celular, email,
                                extensao_arquivo5, extensao_arquivo6, extensao_arquivo7, true);

                        q.atualizaInscritoIPTSP2(inscrito);

                        out.println("Matrícula efetuada com sucesso!.<br /> <a href='http://www.iptsp.ufg.br/geoprocessamento/'> Voltar à página do curso.</a>");
                        out.println("<script>");
                        out.println("window.alert('Matrícula efetuada com sucesso!');");
                        out.println("self.location ='http://www.iptsp.ufg.br/geoprocessamento';");
                        out.println("</script>");

                    } else {
                        out.println("ERRO na matrícula! Usuário não está inscrito! <a href='http://www.iptsp.ufg.br/geoprocessamento/'> Voltar à página do curso.</a>");
                        out.println("<script>");
                        out.println("window.alert('Usuário não está cadastrado!');");
                        out.println("self.location ='http://www.iptsp.ufg.br/geoprocessamento';");
                        out.println("</script>");
                    }
                } else {
                    out.println("ERRO na inscrição! <a href='http://www.iptsp.ufg.br/geoprocessamento/'> Voltar à página do curso.</a>");
                    out.println("<script>window.alert('Erro ao enviar arquivos!');history.go(-1);</script>");
                }
            }
        } catch (UnsupportedDataTypeException ex) {
            out.println("Não é mais possível realizar matricula nesse curso! <a href='http://www.iptsp.ufg.br/geoprocessamento/'> Voltar à página do curso.</a>");
            System.out.println(ex);
            out.println("<script>");
            out.println("window.alert('Não é mais possível realizar matricula nesse curso!');");
            out.println("self.location ='http://www.iptsp.ufg.br/geoprocessamento';");
            out.println("</script>");
        } catch (Exception ex) {
            out.println("ERRO na inscrição! <a href='http://www.iptsp.ufg.br/geoprocessamento/'> Voltar à página do curso.</a>");
            System.out.println(ex);
            out.println("<script>");
            out.println("window.alert('Erro ao efetuar matrícula! Entre em contato com Suporte para tentar resolver o seu problema.');");
            out.println("self.location ='http://www.iptsp.ufg.br/geoprocessamento';");
            out.println("</script>");
        } finally {
            out.println("</body>");
            out.println("</html>");
            out.close();
        }
        //Comunicacao c = new Comunicacao();
        //String mensagem = "Olá, " + nome + ". Sua inscrição no Curso de Geoprocessamento em Saúde, oferecido pela Universidade Federal de Goiás, de número " + id + ", foi confirmada.";
        //String assunto = "Confirmação de inscrição IPTSP - UFG";
        //c.enviarEmail(new String[]{email, "tiagomesq@gmail.com"}, assunto, mensagem, "noreply@ciar.ufg.br");
    }

    private ServletFileUpload getHandler() throws FileUploadException {
        DiskFileItemFactory fileItemFactory = new DiskFileItemFactory();
        /*
         *Set the size threshold, above which content will be stored on disk.
         */
        //fileItemFactory.setSizeThreshold(MAX_SIZE_UPLOAD);
        /*
         * Set the temporary directory to store the uploaded files of size above threshold.
         */
        fileItemFactory.setRepository(tmpDir);

        ServletFileUpload uploadHandler = new ServletFileUpload(fileItemFactory);
        uploadHandler.setHeaderEncoding(ENCODING);
        uploadHandler.setFileSizeMax(MAX_SIZE_UPLOAD);

        return uploadHandler;
    }

    private List getItemsRequest(HttpServletRequest request, ServletFileUpload uploadHandler) throws FileUploadException {
        return uploadHandler.parseRequest(request);
    }

    private String getParameter(String fieldName, List items) throws UnsupportedEncodingException {
        // Process the uploaded items
        Iterator iter = items.iterator();
        while (iter.hasNext()) {
            FileItem item = (FileItem) iter.next();
            if (item.isFormField()) {
                if (item.getFieldName().equalsIgnoreCase(fieldName)) {
                    return new String(item.getString().getBytes("iso-8859-1"), "UTF-8");
                }
            }
        }
        return null;
    }

    private FileItem getFile(String fieldName, List items) {
        // Process the uploaded items
        Iterator iter = items.iterator();
        while (iter.hasNext()) {
            FileItem item = (FileItem) iter.next();
            if (!item.isFormField()) {
                if (item.getFieldName().equalsIgnoreCase(fieldName)) {
                    return item;
                }
            }
        }
        return null;
    }

    private String getPastaDocumentos() {
        String root = getServletContext().getRealPath("/");
        /*String localDocumentos = root.substring(0, root.lastIndexOf(getServletContext().getContextPath().replace("/", System.getProperty("file.separator"))))
        + System.getProperty("file.separator") + CFG.DIRETORIO_ARQUIVOS
        + System.getProperty("file.separator") + CFG.DIRETORIO_DOCUMENTOS
        + System.getProperty("file.separator") + CFG.DIRETORIO_DOCUMENTOS_IPTSP2;*/
        String localDocumentos = "/var/lib/tomcat6/webapps/" + CFG.DIRETORIO_ARQUIVOS
                + System.getProperty("file.separator") + CFG.DIRETORIO_DOCUMENTOS
                + System.getProperty("file.separator") + CFG.DIRETORIO_DOCUMENTOS_IPTSP2;
        return localDocumentos + System.getProperty("file.separator");
    }

    private String getExtensaoArquivo(String name) {
        if (name.lastIndexOf(".") != -1) {
            return name.substring(name.lastIndexOf("."), name.length());
        } else {
            return "";
        }
    }

    // <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code.">
    /** 
     * Handles the HTTP <code>GET</code> method.
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    /** 
     * Handles the HTTP <code>POST</code> method.
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    /** 
     * Returns a short description of the servlet.
     * @return a String containing servlet description
     */
    @Override
    public String getServletInfo() {
        return "Short description";
    }// </editor-fold>
}
